/*
 * Indiana University Community Grid Computing Lab Software License,Version 1.1
 *
 * Copyright (c) 2002 Community Grid Computing Lab, Indiana University.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *      "This product includes software developed by the Indiana University
 *       Community Grid Computing Lab (http://www.communitygrids.iu.edu/)."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Indiana Univeristy","Indiana Univeristy Pervasive Techonology
 *    Labs" and  "Indiana Univeristy Community Grid Computing Lab" must not be
 *    used to endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    http://www.communitygrids.iu.edu/.
 *
 * 5. Products derived from this software may not use "Indiana
 *    University" name nor may "Indiana University" appear in their name,
 *    without prior written permission of the Indiana University.
 *
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
 * INDIANA UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package cgl.sensorgrid.filters;

import cgl.narada.event.NBEvent;
import java.io.*;

public class FileReceiverFilter extends Filter {

    private String filePath;
    private String stationName;
    private FileWriter fw;
    private int noOfObservations;

    public FileReceiverFilter(String[] argsa, String[] argsb) {
        if (argsb.length == 3) {
            if (argsb[0] != null && !argsb[0].equalsIgnoreCase(""))
                stationName = argsb[0];
            if (argsb[1] != null && !argsb[1].equalsIgnoreCase("")) {
                filePath = argsb[1];
                try {
                    //This will create a new FileWriter
                    //If the file exists it will be flushed and owerriten
                    File f = new File(filePath);
                    if (!f.exists()) {
                        f.createNewFile();
                    }
                    fw = new FileWriter(f, false);
                    System.out.println(f.getAbsolutePath());
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
            if (argsb[2] != null && !argsb[2].equalsIgnoreCase("")) {
                noOfObservations = Integer.parseInt(argsb[2]);
            }
            System.out.println("STATION NAME = " + stationName +
                               "\nFILE PATH = " + filePath +
                               "\nNO OF OBSERVATIONS = " + noOfObservations);

        }
        if (fw != null) {
            this.initialize(argsa);
        } else {
            System.out.println("File null");
            System.exit(0);
        }
    }

    private int counter = 0;
    private int lineCount = 0;
    private String sb = new String();

    public void onEvent(NBEvent nbEvent) {
        try {
            /*if (nbEvent.getEventProperties().hasProperties()) {
             if (nbEvent.getEventProperties().getProperty("MARKER") == null) {
                    System.out.println("NO MARKER");
                } else {
             String marker = (String) nbEvent.getEventProperties().getProperty("MARKER");
                    if(marker.equalsIgnoreCase("SOF")){
                        try {
                            System.out.println("Started Receiving data");
                            fw = new FileWriter(filePath, true);
                        } catch (IOException ex) {
                            ex.printStackTrace();
                        }
                    }
                    else {
                        if (marker.equalsIgnoreCase("EOF")) {
                            System.out.println("End Receiving data");
                                Thread.sleep(1000);
                                fw.flush();
                                fw.close();
                                closeBrokerConnection(this.getID());
                        }
                    }
                    //                System.out.println("MARKER = " +
                    //                                   nbEvent.getEventProperties().getProperty(
                    //                                           "MARKER"));
                }
                     }*/
            if (nbEvent.getContentPayload() != null) {
                String msg = new String(nbEvent.getContentPayload());
                counter++;
                lineCount++;
                sb += msg;

                if (lineCount >= 50) {
                    if (fw != null) {
                        fw.write(sb);
                        fw.flush();
                    }
                    lineCount = 0;
                    sb = new String();
                }

                //System.out.print(counter++ + " ");
                System.out.print(new String(nbEvent.getContentPayload()));
                if (counter >= noOfObservations) {
                    System.out.println("Reached maximum # of observations..");

                    if (fw != null) {
                        fw.write(sb);
                        fw.flush();
                    }
                    lineCount = 0;
                    sb = new String();

                    this.getClientService().closeBrokerConnection();
                    this.getClientService().terminateServices();
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }


    public static void main(String[] args) {
        try {
//
//            if (args.length < 7) {
//                System.out.println(
//                        "Usage: java cgl.sensorgrid.filters.FileReceiverFilter " +
//                        "commType nbHost nbPort subTopic siteName directoryPath numberOfObservations");
//                System.exit(0);
//            }
//
//            String commType = args[0];
//            String nbHost = args[1];
//            String nbPort = args[2];
//            String subTopic = args[3];
//            String stationName = args[4];
//            String directoryPath = args[5];
//            String numberOfObservations = args[6];
//
//            String[] argsa = {commType,
//                             nbHost,
//                             nbPort,
//                             subTopic,
//                             ""};
//
//            String path = directoryPath +
//                             "/" + stationName + "_" +
//                             cgl.sensorgrid.common.Tools.
//                             getDate(System.currentTimeMillis()) + ".xyz";
//
//               System.out.println("PATH = " + path);
//
//            String[] argsb = {stationName,
//                             path ,
//                             numberOfObservations};
//

            String station = "DESC";
            String[] argsa = {"niotcp",
                             "gf2.ucs.indiana.edu",
                             "3344",
                             "/SOPAC/GPS/CRTN_01/POS/" + station,
                             ""};

            String[] argsb = {"DESC",
                             "C:/temp/parkfield/rdahmm-hpsearch/" + station +
                             "/" + station + "_" +
                             cgl.sensorgrid.common.Tools.
                             getDate(System.currentTimeMillis()) + ".xyz",
                             "3000"};

            FileReceiverFilter f = new FileReceiverFilter(argsa, argsb);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
